grammar DecafLang;

program
    : stat* EOF
    ;

stat
    : printStmt
    | decl
    | assign
    ;

printStmt
    : 'print' '(' expr ')' ';'
    ;

decl
    : 'int' ID '=' INT ';'
    | 'string' ID '=' STRING ';'
    ;

assign
    : ID '=' expr ';'
    ;

expr
    : INT
    | STRING
    | BOOL
    | ID
    ;

// --- Lexer Rules ---

BOOL   : 'true' | 'false' ;
ID     : [a-zA-Z_] [a-zA-Z0-9_]* ;
INT    : [0-9]+ ;
STRING : '"' (~["\\] | '\\' .)* '"' ;
WS     : [ \t\r\n]+ -> skip ;

